//题目:
// 给定两个字符串s1 和 s2，返回 使两个字符串相等所需删除字符的 ASCII 值的最小和 。

// 示例 1:
// 输入: s1 = "sea", s2 = "eat"
// 输出: 231
// 解释: 在 "sea" 中删除 "s" 并将 "s" 的值(115)加入总和。
// 在 "eat" 中删除 "t" 并将 116 加入总和。
// 结束时，两个字符串相等，115 + 116 = 231 就是符合条件的最小和。

// 示例 2:
// 输入: s1 = "delete", s2 = "leet"
// 输出: 403
// 解释: 在 "delete" 中删除 "dee" 字符串变成 "let"，
// 将 100[d]+101[e]+101[e] 加入总和。在 "leet" 中删除 "e" 将 101[e] 加入总和。
// 结束时，两个字符串都等于 "let"，结果即为 100+101+101+101 = 403 。
// 如果改为将两个字符串转换为 "lee" 或 "eet"，我们会得到 433 或 417 的结果，比答案更大。
#include<iostream>
#include<vector>

using namespace std;
//代码
class Solution 
{
public:
    int minimumDeleteSum(string s1, string s2) 
    {
        s1=" "+s1,s2=" "+s2;
        int n1=s1.size(),n2=s2.size();
        //1.创建dp表————dp[i][j]表示：s1中[0,i]子串与s2中[0,j]子串相同时，所需要删除的字符ASCII值最小和
        vector<vector<int>> dp(n1,vector<int>(n2));
        //2.初始化
        for(int i=1;i<n1;i++) dp[i][0]=dp[i-1][0]+s1[i];
        for(int j=1;j<n2;j++) dp[0][j]=dp[0][j-1]+s2[j];
        //3.填表————从上往下 + 从左往右
        for(int i=1;i<n1;i++)
        {
            for(int j=1;j<n2;j++)
            {
                if(s1[i]==s2[j]) dp[i][j]=dp[i-1][j-1];
                else
                {
                    int min_sum=min(dp[i-1][j]+s1[i],dp[i][j-1]+s2[j]);
                    dp[i][j]=min(min_sum,dp[i-1][j-1]+s1[i]+s2[j]);
                }
            }
        }
        //4.确定返回值
        return dp[n1-1][n2-1];
    }
};